//package com.songjia.springcloud.rule;
//
//import java.util.List;
//import java.util.concurrent.atomic.AtomicInteger;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.netflix.client.config.IClientConfig;
//import com.netflix.loadbalancer.AbstractLoadBalancerRule;
//import com.netflix.loadbalancer.ILoadBalancer;
//import com.netflix.loadbalancer.RoundRobinRule;
//import com.netflix.loadbalancer.Server;
//
//public class MyRule extends AbstractLoadBalancerRule {
//
//	private AtomicInteger requestCount; // 总共被调用的次数，目前要求每台被调用5次
//
//	private AtomicInteger serverIndex; // 当前提供服务的机器号
//
//	private static Logger log = LoggerFactory.getLogger(RoundRobinRule.class);
//
//	public MyRule() {
//		requestCount = new AtomicInteger(0);
//		serverIndex = new AtomicInteger(0);
//	}
//
//	public MyRule(ILoadBalancer lb) {
//		this();
//		setLoadBalancer(lb);
//	}
//
//	public Server choose(ILoadBalancer lb, Object key) {
//		if (lb == null) {
//			log.warn("no load balancer");
//			return null;
//		}
//
//		Server server = null;
//		while (server == null) {
//
//			if (Thread.interrupted()) {
//				return null;
//			}
//			List<Server> reachableServers = lb.getReachableServers();
//			List<Server> allServers = lb.getAllServers();
//			
//			int serverCount = allServers.size();
//			
//
//			int nextServerIndex = incrementAndGetModulo(serverCount);
//			server = allServers.get(nextServerIndex);
//
//			if (server == null) {
//				/* Transient. */
//				Thread.yield();
//				continue;
//			}
//
//			if (server.isAlive() && (server.isReadyToServe())) {
//				return (server);
//			}
//
//			// Next.
//			server = null;
//		}
//
//		if (count >= 10) {
//			log.warn("No available alive servers after 10 tries from load balancer: " + lb);
//		}
//		return server;
//	}
//
//	@Override
//	public Server choose(Object key) {
//		return choose(getLoadBalancer(), key);
//	}
//
//	@Override
//	public void initWithNiwsConfig(IClientConfig clientConfig) {
//	}
//}